package com.linzm.leetcode.primary.exercises2_20230116;

import java.util.*;

/**
 * @Author zimingl
 * @Date 2023/1/16 23:02
 * @Description: 检查相同字母间的距离
 */
public class Demo4_2399 {
    /**
     * 输入：s = "abaccb", distance = [1,3,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
     * 输出：true
     * 解释：
     * - 'a' 在下标 0 和下标 2 处出现，所以满足 distance[0] = 1 。
     * - 'b' 在下标 1 和下标 5 处出现，所以满足 distance[1] = 3 。
     * - 'c' 在下标 3 和下标 4 处出现，所以满足 distance[2] = 0 。
     * 注意 distance[3] = 5 ，但是由于 'd' 没有在 s 中出现，可以忽略。
     * 因为 s 是一个匀整字符串，返回 true 。
     */
    public static void main(String[] args) {
        Demo4_2399 demo4_2399 = new Demo4_2399();
        String s = "abaccb";
        int[] distance = {1, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
        boolean bool = demo4_2399.checkDistances2(s, distance);
        System.out.println(bool);
    }

    private boolean checkDistances(String s, int[] distance) {
        TreeMap<Integer, TreeSet<Integer>> map = new TreeMap<>();
        for (int i = 0; i < s.length(); i++) {
            TreeSet set = map.getOrDefault(s.charAt(i) - 97, new TreeSet<>());
            set.add(i);
            map.put(s.charAt(i) - 97, set);
        }
        Set<Integer> keys = map.keySet();
        TreeMap<Integer, Integer> mapDistance = new TreeMap<>();
        for (int i = 0; i < distance.length; i++) {
            if (keys.contains(i)) {
                mapDistance.put(i, distance[i]);
            }
        }
        for (Map.Entry<Integer, TreeSet<Integer>> entry : map.entrySet()) {
            TreeSet<Integer> value = entry.getValue();
            Integer len = value.last() - value.first() - 1;
            if (!Objects.equals(mapDistance.get(entry.getKey()), len)) {
                return false;
            }
        }
        return true;
    }

    private boolean checkDistances2(String s, int[] distance) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            if (map.get(s.charAt(i) - 97) == null) {
                map.put(s.charAt(i) - 97, i);
                continue;
            }
            if (distance[s.charAt(i) - 97] != (i - map.get(s.charAt(i) - 97) - 1)) {
                return false;
            }
        }
        return true;
    }
}
